Skip to main content

Barikoi Android API SDK

License API Kotlin Version

A modern, easy-to-use Android SDK for Barikoi Location APIs. Built with Kotlin, Coroutines, and Retrofit.


Features

11 Powerful APIs

APIDescription
Reverse GeocodingConvert coordinates to human-readable addresses
AutocompleteSmart place suggestions as the user types
Rupantor GeocodeAdvanced free-text address formatting and geocoding
Route OverviewGet distance and duration between two points
Calculate RouteTurn-by-turn directions via GraphHopper
Route OptimizationFind the most efficient order for multiple waypoints
Place SearchFull-text search with session-based place details
Nearby PlacesFind places within a radius
Snap to RoadSnap a coordinate to the nearest road
GeofencingCheck whether a point is within a given radius

Modern Android Stack

  • 100% Kotlin
  • Coroutines for async operations
  • Retrofit 2.11 + OkHttp 4.12 for networking
  • Moshi 1.15 for JSON parsing (KSP code-gen)
  • Type-safe sealed-class error handling

Production Ready

  • Automatic API-key injection via OkHttp interceptor
  • Locale-safe coordinate formatting (no comma-decimal bugs)
  • Comprehensive error mapping (network, HTTP 4xx/5xx, parse, validation)
  • ProGuard / R8 consumer rules included
  • Five unit-test suites (MockWebServer)

Installation

Step 1: Add JitPack repository

In your root settings.gradle.kts:

dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}

Step 2: Add the dependency

In your app's build.gradle.kts:

dependencies {
implementation("com.github.barikoi:barikoi-api-sdk-android:1.0.0")
}

Quick Start

Step 1 – Initialize once in Application.onCreate():

class MyApp : Application() {
override fun onCreate() {
super.onCreate()
BarikoiClient.init(
apiKey = BuildConfig.BARIKOI_API_KEY,
enableLogging = BuildConfig.DEBUG
)
}
}

Note: Add the MyApp class in your AndroidManifest.xml

Step 2 – Use anywhere with no key required:

class MyActivity : AppCompatActivity() {
// Returns the same cached singleton every time
private val barikoi = BarikoiClient()

fun fetchAddress() {
lifecycleScope.launch {
barikoi.reverseGeocode(23.8103, 90.4125)
.onSuccess { place -> Log.d("Barikoi", "Address: ${place.address}") }
.onFailure { error -> Log.e("Barikoi", "Error: ${error.message}") }
}
}
}

API Reference

Reverse Geocoding

Convert coordinates to a human-readable address:

barikoi.reverseGeocode(
latitude = 23.8103,
longitude = 90.4125,
bangla = true // optional: return address in Bangla
).onSuccess { place ->
println("Address : ${place.displayAddress}")
println("Area : ${place.area}")
println("City : ${place.city}")
println("Post : ${place.displayPostCode}")
}.onFailure { error ->
println("Error: ${error.message}")
}

Autocomplete

Get smart place suggestions:

barikoi.autocomplete(
query = "Gulshan",
bangla = true
).onSuccess { places ->
places.forEach { place ->
println("${place.address}${place.area}")
}
}

Rupantor Geocode

Format and geocode a free-text address:

barikoi.rupantorGeocode(
query = "House 10, Road 5, Gulshan 1, Dhaka",
thana = true,
district = true,
bangla = false
).onSuccess { response ->
println("Fixed address : ${response.fixedAddress}")
println("Bangla address : ${response.banglaAddress}")
println("Confidence : ${response.confidenceScorePercentage}%")
println("Geocoded latitude : ${response.geocodedAddress?.latitude}")
println("Geocoded longitude : ${response.geocodedAddress?.longitude}")
}

Route Overview

Get distance and duration between two points:

barikoi.routeOverview(
startLat = 23.8103,
startLon = 90.4125,
endLat = 23.7808,
endLon = 90.4217,
profile = "car" // optional: car | foot | bike
).onSuccess { routes ->
routes.firstOrNull()?.let { route ->
println("Distance : ${route.distance} m")
println("Duration : ${route.duration} s")
}
}

Calculate Route

Get detailed turn-by-turn directions via GraphHopper:

barikoi.calculateRoute(
startLat = 23.8103,
startLon = 90.4125,
endLat = 23.7808,
endLon = 90.4217,
profile = "car"
).onSuccess { response ->
response.paths?.firstOrNull()?.let { path ->
println("Distance : ${path.distanceInKm} km")
println("Duration : ${path.durationInMinutes} min")
path.instructions?.forEach { step ->
println(" → ${step.text}")
}
}
}

Route Optimization

Find the most efficient order to visit multiple waypoints:

barikoi.optimizeRoute(
sourceLat = 23.8103,
sourceLon = 90.4125,
destinationLat = 23.7516,
destinationLon = 90.3888,
waypoints = listOf(
Pair(23.7808, 90.4217),
Pair(23.7650, 90.4050)
),
profile = "car"
).onSuccess { response ->
response.paths?.firstOrNull()?.let { path ->
println("Optimized distance : ${path.distanceInKm} km")
println("Optimized duration : ${path.durationInMinutes} min")
}
}

Place Search + Details

Full-text search with session-based place details:

// Step 1 – search
barikoi.searchPlace("Bashundhara").onSuccess { response ->
val sessionId = response.sessionId ?: return@onSuccess
val firstPlace = response.places?.firstOrNull() ?: return@onSuccess

// Step 2 – fetch details with the session ID
barikoi.placeDetails(
placeCode = firstPlace.placeCode ?: return@onSuccess,
sessionId = sessionId
).onSuccess { place ->
println("Name : ${place.name}")
println("Address : ${place.displayAddress}")
println("Lat/Lon : ${place.latitude}, ${place.longitude}")
}
}

Nearby Places

Find places within a radius:

barikoi.nearbyPlaces(
latitude = 23.8103,
longitude = 90.4125,
radius = 1.0, // kilometres
limit = 10
).onSuccess { places ->
places.forEach { place ->
println("${place.address}${place.distanceWithinMeters} m away")
}
}

Snap to Road

Snap a coordinate to the nearest road:

barikoi.snapToRoad(
latitude = 23.8103,
longitude = 90.4125
).onSuccess { response ->
println("Snapped to : ${response.snappedLatitude}, ${response.snappedLongitude}")
println("Distance : ${response.distance} m")
}

Geofencing

Check whether a destination is within a radius:

barikoi.checkNearby(
currentLat = 23.8103,
currentLon = 90.4125,
destinationLat = 23.8110,
destinationLon = 90.4130,
radiusMeters = 500.0
).onSuccess { response ->
if (response.isInside) {
println("Inside radius! Distance: ${response.distance} m")
} else {
println("Outside radius. Distance: ${response.distance} m")
}
}

Error Handling

All SDK methods return Result<T>. Errors are mapped to typed BarikoiError subclasses:

barikoi.reverseGeocode(lat, lon).onFailure { error ->
when (error) {
is BarikoiError.NetworkError -> showToast("No internet connection")
is BarikoiError.UnauthorizedError -> showToast("Invalid or missing API key")
is BarikoiError.QuotaExceededError -> showToast("API quota exceeded")
is BarikoiError.RateLimitError -> showToast("Too many requests – try again later")
is BarikoiError.BadRequestError -> showToast("Invalid request parameters")
is BarikoiError.ValidationError -> showToast("Bad input: ${error.message}")
is BarikoiError.ParseError -> showToast("Unexpected response format")
is BarikoiError.HttpError -> showToast("HTTP ${error.code}: ${error.message}")
else -> showToast("Error: ${error.message}")
}
}

Convenience helpers on BarikoiError

PropertyDescription
isNetworkErrorConnectivity failure (no internet, timeout, DNS)
isAuthErrorHTTP 401 / 403 – invalid or missing API key
isQuotaErrorHTTP 402 – billing / quota limit exceeded
isRateLimitErrorHTTP 429 – too many requests
isValidationErrorClient-side bad input (blank query, invalid coords, etc.)
isParseErrorResponse received but could not be parsed
isNotFoundHTTP 404
isClientErrorAny 4xx or local validation error
isServerErrorAny 5xx server-side error

Configuration

Custom timeouts

val barikoi = BarikoiClient.Builder()
.apiKey("YOUR_API_KEY")
.connectTimeoutSeconds(60)
.readTimeoutSeconds(60)
.writeTimeoutSeconds(60)
.build()

HTTP logging (debug only)

val barikoi = BarikoiClient.Builder()
.apiKey("YOUR_API_KEY")
.enableLogging(true) // prints full request / response bodies in Logcat
.build()

Permissions

Add to your AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Requirements

ItemVersion
Min SDKAPI 24 (Android 7.0)
Target SDKAPI 36+
Kotlin2.0.21
Coroutines1.9.0
Retrofit2.11.0
OkHttp4.12.0
Moshi1.15.1

ProGuard / R8

Consumer ProGuard rules are bundled automatically. No extra configuration is needed.


Get Your API Key

  1. Sign up at https://developer.barikoi.com/register
  2. Create a new API key from your dashboard
  3. Pass it to BarikoiClient.init() or BarikoiClient.Builder().apiKey()

License

Copyright 2025 Barikoi

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Support

ChannelLink
Emailhello@barikoi.com
Websitehttps://barikoi.com
API Docshttps://docs.barikoi.com/api

Made by Barikoi